package org.vm.cmbcdirect.utils;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * Created by violorch on 2016/3/24.
 */
public class SaveUploadUtil {

    public List<File> saveUploadUtil(HttpServletRequest request) {
        List<File> saveFiles = new ArrayList<File>();
        // DiskFileItemFactory：创建 FileItem 对象的工厂，在这个工厂类中可以配置内存缓冲区大小和存放临时文件的目录。
        DiskFileItemFactory factory = new DiskFileItemFactory();
        factory.setSizeThreshold(4096);
        factory.setRepository(BaseUtil.getFaceTmpFile());

        // ServletFileUpload：负责处理上传的文件数据，并将每部分的数据封装成一到 FileItem 对象中。
        // 在接收上传文件数据时，会将内容保存到内存缓存区中，如果文件内容超过了 DiskFileItemFactory 指定的缓冲区的大小，
        // 那么文件将被保存到磁盘上，存储为 DiskFileItemFactory 指定目录中的临时文件。
        // 等文件数据都接收完毕后，ServletUpload再从文件中将数据写入到上传文件目录下的文件中
        ServletFileUpload upload = new ServletFileUpload(factory);
        upload.setSizeMax(1000000 * 2);
        try {
            List files = upload.parseRequest(request);
            String itemNo = "";

            for (Iterator iterator = files.iterator(); iterator.hasNext(); ) {
                FileItem item = (FileItem) iterator.next();

                // 判断是文本信息还是文件
                //是普通的表单输入域
                if (item.isFormField()) {
                    if ("itemNo".equals(item.getFieldName())) {
                        itemNo = item.getString();
                    }
                }
                // 是否为input="type"输入域
                if (!item.isFormField()) {
                    // 上传文件的名称和完整路径
                    String fileName = item.getName();
                    long size = item.getSize();

                    if (fileName == null || fileName.equals("") && size == 0) {
                        continue;
                    }

                    //截取字符串 如：C:\WINDOWS\Debug\PASSWD.LOG
                    fileName = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.length());

                    // 保存文件在服务器的物理磁盘中：第一个参数是：完整路径（不包括文件名）第二个参数是：文件名称
                    //item.write(file);
                    //修改文件名和物料名一致，且强行修改了文件扩展名为gif
                    //item.write(new File(uploadPath, itemNo + ".gif"));
                    //将文件保存到目录下，不修改文件名
                    File saveFile = new File(BaseUtil.getFaceUploadFile(), fileName);
                    item.write(saveFile);
                    saveFiles.add(saveFile);
                }
            }
            return saveFiles;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}
